#ifndef MYSERVER_H
#define MYSERVER_H

#include <QObject>

class QTcpServer;
class QTcpSocket;

typedef struct SocketInfo{
    QTcpSocket *socket;     //socket
    QByteArray temp;        //缓冲区
    quint64 index;          //序号
}SocketInfo;

/**
 * @brief The MyServer class
 *          网络服务类，提供网络服务
 * @version 1.0
 * @author Albert
 * @date 2021.03.23
 *      [1.0]
 *          1.启动网络服务，监听端口
 *          2.停止网络服务，断开所有连接
 *          3.获取服务状态
 *          4.读取客户端数据
 *          5.向客户端发送数据
 */
class MyServer : public QObject
{
    Q_OBJECT
protected:
    explicit MyServer(QObject *parent = nullptr);

public:
    /**
     * @brief 启动网络服务，如果网络已经启动，关闭旧连接，启动新服务
     * @param port 端口号
     * @return bool 启动的结果
     */
    bool startNet(quint16 port);
    /**
     * @brief 停止所有网络连接，关闭端口监听
     */
    void stopNet();
    /**
     * @brief 获取当前服务状态
     * @return
     */
    bool getNetStatus();
    /**
     * @brief 获取当前客户端在线数量
     * @return
     */
    int getClientNumber();
    /**
     * @brief 向所有客户端发送消息
     * @param data 要发送的数据
     */
    void sendDataToAllClient(const QByteArray &data);
    /**
     * @brief 向客户端发送消息
     * @param data
     * @param des 客户端的socket描述符
     */
    void sendDataToClient(const QByteArray &data, int des);
    /**
     * @brief 数组帧处理
     * @param data
     * @param src 数据来源socket的描述符
     */
    virtual void handleFrame(const QByteArray &data, int src) = 0;

protected slots:
    //槽函数不允许只声明不定义
    void newConnectionSlot();
    void socketReadyReadSlot();
    void socketDisconnectedSlot();

protected:
    QTcpServer *server;
    QList<SocketInfo *> socketList;

};

#endif // MYSERVER_H
